草庐IT

C++ unique_ptr 和映射

全部标签

c++ - 使用 std::shared_ptr<std::vector> 而不是 boost::shared_array 有意义吗?

现在我正在重写部分代码以使用C++11标准。在某些地方我发现了以下代码:boost::shared_arrayarray;是否可以将其替换为:std::shared_ptr>array;我正在尝试在我的代码中替换C++11中已经存在的所有boost功能。我需要澄清一点。实际上我需要一个原始数组(但有引用计数,所以它可以自动删除),不需要所有那些vector特征。所以boost::shared_array解决了我想要的问题,没有任何额外的成本。但我试图让我的代码尽可能多地使用新标准(尽管新标准仍未涵盖来自boost的许多库)。谢谢。 最佳答案

c++ - 使用可变参数模板的多键映射

我正在尝试使用C++中的可变参数模板实现具有不同访问键的映射。我想要得到的是让这样的语法起作用:MultikeyMapmap1;//intanddoublearekeys,floatisvaluetypemap1[2]=3.5;map1[5.7]=22;MultikeyMapmap2;//morekeys,intisvaluetypemap2[100000000000ULL]=56;//etc...我现在的样子:templateclassMultikeyMap;templateclassMultikeyMap:protectedstd::map,protectedMultikeyMap

c++ - 将 boost::shared_ptr 与重载下标运算符 ([]) 的类一起使用

我有一个重载下标运算符的类:classSomeClass{public:int&operator[](constintidx){returnsomeArray[idx];}private:intsomeArray[10];};这当然允许我像这样访问someArray成员的数组元素:SomeClassc;intx=c[0];然而,一些SomeClass的实例将被包裹在一个boost共享指针中:boost::shared_ptrp(newSomeClass);但是,为了使用下标运算符,我必须使用更冗长的语法,这种语法破坏了下标运算符重载的简洁性:intx=p->operator[](0);

c++ - Qt 相当于 boost::ptr_vector?

我需要一个拥有指针所有权的指针容器——即当一个元素被删除,或者容器超出范围时,它会释放所有指针,就像在boost::ptr_vector中一样。.QList>不起作用(编译错误,没有复制构造函数?)。现在我正在使用QList>,但它的引用计数和用于多线程的昂贵互斥体感觉有点矫枉过正。编辑:我刚刚了解到QPtrList(感谢@ForEveR)这在Qt3中非常等效,但已从更高版本中删除。我只是不明白他们为什么要删除它。 最佳答案 您是对的,由于上述原因,QSharedPointer有点开销。不幸的是,Qt中没有这样的指针vector,当

c++ - 将 shared_ptr 移动到在 shared_ptr 指向的对象上调用的方法

给定structX{voidf(std::shared_ptr);};autox(std::make_shared());我大概可以安全地做x->f(std::move(x));在C++17中,因为x->f在构造X::f的参数之前求值,对吧?据我所知,在早期版本的C++中没有这样的保证。我怎样才能在C++11和C++14中实现类似的东西?PS:请注意,即使使用std::unique_ptr而不是std::shared_ptr也是如此。 最佳答案 我认为在C++11和C++14中可以做的最好的事情是不改变接口(interface)或使

c++ - 返回对 std::unique_ptr 的引用的原因

我想知道在C++中是否有合理的理由通过引用返回唯一指针,即std::unique_ptr&?我以前从未真正见过这种技巧,但我的新项目似乎经常使用这种模式。乍一看,它只是有效地打破/规避了“唯一所有权”契约,使得无法在编译时捕获错误。考虑以下示例:classTmContainer{public:TmContainer(){//Createsomesortofcomplexobjectonheapandstoreunique_ptrtoitm_time=std::unique_ptr(newtm());//Storesomethingmeaningfulinitsfieldsm_time-

c++ - is_assignable 和 std::unique_ptr

Here是来自gcc的测试文件,livedemostructdo_nothing{templatevoidoperator()(T*){}};intmain(){inti=0;std::unique_ptrp1(&i);std::unique_ptrp2;static_assert(!std::is_assignable::value,"");//note!here.}std::is_assignableIftheexpressionstd::declval()=std::declval()iswell-formedinunevaluatedcontext,providesthemem

c++ - 比较两个映射 vector

我有两种获取大量数据的方法。数据存储在已排序的vector>中.我想确定两个vector之间是否存在不一致。我目前在做什么(伪代码):foriin0...min(length(vector1),length(vector2)):for(k,v)invector1[i]:ifv!=vector2[i][k]://reportthatkisbadforindexi,//withvector1havingv,vector2havingvector2[i][k]foriin0...min(length(vector1),length(vector2)):for(k,v)invector2[i]

c++ - 专家的字符串和字符映射问题

这是一个让我难过的问题(明智的解决方案):给定一个strS,应用字符映射Cm={a=(m,o,p),d=(q,u),...}并使用C或C++打印出所有可能的组合。字符串可以是任意长度,字符映射的个数是变化的,不会有任何映射到另一个映射(从而避免循环依赖)。例如:字符串abba与映射a=(e,o),d=(g,h),b=(i)将打印:abba,ebba,obba,abbe,abbo,ebbe,ebbo,obbe,obbo,aiba,aiia,abia,eiba,eiia,...... 最佳答案 绝对有可能,并不难...但这肯定会生成很多

c++ - boost::interprocess::shared_ptr 是线程安全的(和进程间安全的)吗?

我想在线程之间共享数据,并在最后一个用户完成后自动删除它。这似乎在大多数情况下都有效,在boost::fixed_managed_shared_memory段中使用boost::interprocess::shared_ptr:但并非总是如此。那么,boost::interprocess::shared_ptr线程(和进程间)是否安全?如果我在固定地址使用我的共享内存(我很确定这在我的64位(好吧,48位)地址空间中是没问题的),是否可以使用一个普通的boost::shared_ptr(它是线程安全的)?一些说明:我使用的指针类型是普通的void*,(我的共享内存映射到一个固定地址)。